AttributeError: module 'apps.reservations.models.Guest' has no attribute '_meta'

AttributeError: module 'apps.reservations.models.Guest' has no attribute '_meta'
Sevy
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Katowice
  • Postów:20
0

Próbuję wydobyć atrybut pola modelu, ale oczywiście mam ścianę. Próbując zrobić to w shellu, wszystko jest okej screenshot-20200726190055.png.
Natomiast kiedy odpalam testy dostaję błąd AttributeError: module 'apps.reservations.models.Guest' has no attribute '_meta'

Kod, którego dotyczy cała zagwozdka

Kopiuj
from faker import Faker
 
from apps.reservations.models import Guest
 
fake = Faker()
fake_profile = fake.simple_profile()
 
 
class TestingFactory():
 
    [...]
 
    def guest_factory(self):
        COMMENT_MAX_LENGTH = Guest._meta.get_field('comment').max_length # TU JEST PROBLEM
 
        guest, _ = Guest.objects.get_or_create(
            first_name=fake_profile['name'][0],
            last_name=fake_profile['name'][1],
            sex=fake_profile['sex'],
            birth_date=fake_profile['birth_date'],
            nationality=fake.country_code(),
            passport_number='AEO123456',
            phone_number='+48123456789',
            email=fake_profile['mail'],
            comment=fake.text(max_nb_chars=COMMENT_MAX_LENGTH)
        )
 
        return guest

Co ciekawe, zorientowałem się, że kiedy próbuję hardkodować tę wartość to dostaję jeszcze inny error AttributeError: module 'apps.reservations.models.Guest' has no attribute 'objects'

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. Zacząłbym do tego że pola _X w pythonie z konwencji uważa sie za prywatne i nie powinieneś ich dotykać bo API może się zmienić i mogą zniknąć.
    2 .Odpalasz to tym samym interpreterem?
  2. Zgaduje że to pole jest jakos monkey-patchowane kiedy moduł się inicjalizuje i z jakiegoś powodu dzieje się to inaczej w obu przypadkach. Możliwe że gdzieś w tym module jakoś dziwnie wykrywają czy moduł jest importowany czy uruchamiany i jakieś operacje nie są triggerowane.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Sevy
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Katowice
  • Postów:20
0

@Shalom:

pola _X w pythonie z konwencji uważa sie za prywatne i nie powinieneś ich dotykać

no wiem, ale chcę tylko dostać się do tej wartości, żeby nie hardkodować. nie sądzę, żeby w najbliższym stuleciu się to zmieniło.

Odpalasz to tym samym interpreterem

wszystko jest postawione na dockerze

Co do drugiego punktu, to nic nie zrozumialem 😂

edytowany 1x, ostatnio: Sevy
AN
  • Rejestracja:prawie 11 lat
  • Ostatnio:5 dni
  • Postów:973
0

Jak to odpalasz? W sensie to TestingFactory, przez Django testy? Bo jeśli nie odpalasz ani django serwera ani shella itd. to raczej tego tam nie będziesz miał


Zdalna praca dla Senior Python Developerów --> PW
Sevy
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Katowice
  • Postów:20
0

@anonimowy: wszystko stoi na dockerze, więc serwer mam włączony non stop.
może po prostu podrzucę repo https://github.com/SewerynPiorkowski/SHotel

Sevy
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Katowice
  • Postów:20
0

Okej, odświeżam temat bo jest pewien postęp.

Kopiuj
from django.contrib.auth import get_user_model

from faker import Faker

# from apps.reservations.models import Guest

User = get_user_model()
fake = Faker()
fake_profile = fake.simple_profile()


class TestingFactory():

    def user_factory(self):
        user, _ = User.objects.get_or_create(
            username=fake_profile['username'],
            email=fake_profile['mail'],
            first_name=fake_profile['name'][0],
            last_name=fake_profile['name'][1],
            sex=fake_profile['sex'],
            birth_date=fake_profile['birthdate'],
            phone_number='+48123456789',
            passport_number='AEO123456'
        )

        return user

    def guest_factory(self, model):
        COMMENT_MAX_LENGTH = model._meta.get_field('comment').max_length

        guest, _ = model.objects.get_or_create(
            first_name=fake_profile['name'][0],
            last_name=fake_profile['name'][1],
            sex=fake_profile['sex'],
            birth_date=fake_profile['birthdate'],
            nationality=fake.country_code(),
            passport_number='AEO123456',
            phone_number='+48123456789',
            email=fake_profile['mail'],
            comment=fake.text(max_nb_chars=COMMENT_MAX_LENGTH)
        )

        return guest

Do metody guest_factory przekazałem model i działa tak jak powinno, aczkolwiek chciałbym tego uniknąć.

AN
  • Rejestracja:prawie 11 lat
  • Ostatnio:5 dni
  • Postów:973
0

Po co w ogóle chcesz to osiągnąć? Bo max_length jest przetestowany przez Django, nie lepiej wstawić tu losową zawartość nie oglądając się na max_length?


Zdalna praca dla Senior Python Developerów --> PW

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.