условное выражение включает в linq к объектам?

Ну, прошло некоторое время с 2008 года, и пришло время для нового ответа Начиная с Django 1.5 вы сможете создавать пользовательский класс User. На самом деле, в то время, когда я пишу это, оно уже объединено с мастером, так что вы можете попробовать его.

Есть некоторая информация об этом в документах или, если вы хотите углубиться в это, в этот коммит .

Все, что вам нужно сделать, это добавить AUTH_USER_MODEL к настройкам, указав путь к пользовательскому классу пользователя, который расширяет либо AbstractBaseUser (более настраиваемая версия), либо AbstractUser (более или менее старый пользовательский класс, который вы можете расширить).

Для людей, которым лень кликать, вот пример кода (взят из документов ):

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)


class MyUserManager(BaseUserManager):
    def create_user(self, email, date_of_birth, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=MyUserManager.normalize_email(email),
            date_of_birth=date_of_birth,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, date_of_birth, password):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        u = self.create_user(username,
                        password=password,
                        date_of_birth=date_of_birth
                    )
        u.is_admin = True
        u.save(using=self._db)
        return u


class MyUser(AbstractBaseUser):
    email = models.EmailField(
                        verbose_name='email address',
                        max_length=255,
                        unique=True,
                    )
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['date_of_birth']

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __unicode__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

21
задан tim 22 July 2009 в 00:43
поделиться

4 ответа

Это должно помочь:

using (TestEntities db = new TestEntities())
{
    var query = from d in db.Dealership
                select new
                {
                    Dealer = d,
                    Parts = d.Part.Where
                    (
                        p => p.Price < 100.0 
                             && p.Supplier.Country == "Brazil"
                    ),
                    Suppliers = d.Part.Select(p => p.Supplier)
                };

    var dealers = query.ToArray().Select(o => o.Dealer);
    foreach (var dealer in dealers)
    {
        Console.WriteLine(dealer.Name);
        foreach (var part in dealer.Part)
        {
            Console.WriteLine("  " + part.PartId + ", " + part.Price);
            Console.WriteLine
                (
                "  " 
                + part.Supplier.Name 
                + ", " 
                + part.Supplier.Country
                );
        }
    }
}

Этот код предоставит вам список дилерских центров, каждое из которых содержит отфильтрованный список деталей. Каждая часть ссылается на поставщика. Интересно то, что вам нужно создать анонимные типы в выбранном способе, как показано. В противном случае свойство Part объектов дилерского центра будет пустым.

Кроме того, вы должны выполнить инструкцию SQL перед выбором дилеров из запроса. В противном случае свойство Part дилеров снова будет пустым. Вот почему я помещаю вызов ToArray () в следующую строку:

var dealers = query.ToArray().Select(o => o.Dealer);

Но я согласен с Дарреном в том, что это может быть не тем, чего ожидают пользователи вашей библиотеки.

15
ответ дан 29 November 2019 в 21:49
поделиться

Я что-то упустил, или вы просто ищете ключевое слово Any ?

var query = dealerships.Where(d => d.parts.Any(p => p.price < 100.00) || 
                              d.parts.suppliers.Any(s => s.country == "brazil"));
1
ответ дан 29 November 2019 в 21:49
поделиться

Вы уверены, что это то, что вам нужно? Единственная причина, по которой я спрашиваю, заключается в том, что после того, как вы добавите фильтр для частей вне дилерских центров, ваши результаты больше не будут дилерскими центрами. Вы имеете дело со специальными объектами, которые, по большей части, очень близки к дилерским центрам (с такими же свойствами), но значение свойства «Детали» другое. Это не отношения между дилерскими центрами и запчастями, а отфильтрованные отношения.

Или, другими словами, если я извлекаю дилерский центр из ваших результатов и передаю его методу, который я написал, а затем в моем методе я вызываю:

var count = dealership.Parts.Count();

Я ожидаю получить детали, а не отфильтрованные детали из Бразилии, где цена меньше 100 долларов.

Если вы не используете объект дилерского центра для передачи отфильтрованных данных, это станет очень просто. Это становится очень просто:

    var query = from d in dealerships
               select new { DealershipName = d.Name, 
CheapBrazilProducts = dealership.Parts.Where(d => d.parts.Any(p => p.price < 100.00) || d.parts.suppliers.Any(s => s.country == "brazil")) };

Если бы мне просто нужно было получить отфильтрованные наборы, как вы просили, я бы, вероятно, использовал технику, о которой упоминал выше, а затем использовал бы такой инструмент, как Automapper, чтобы скопировать отфильтрованные результаты из моего анонимного класса в настоящий класс. Это не очень элегантно, но должно работать.

Надеюсь, это поможет! Это была интересная проблема.

6
ответ дан 29 November 2019 в 21:49
поделиться

Да, это то, что я хотел сделать, я думаю, что в следующем выпуске Data Services будет возможность выполнять только те запросы LINQ to REST, которые были бы хороши, пока я просто переключился на загрузку обратное и Включить связанный объект, который будет загружен несколько раз, но теоретически его нужно загрузить только один раз в первом Включить, как в этом коде

return this.Context.SearchHistories.Include("Handle")
    .Where(sh => sh.SearchTerm.Contains(searchTerm) && sh.Timestamp > minDate && sh.Timestamp < maxDate);

, прежде чем я попытаюсь загрузить для любого Обработать searchHistories, которые соответствуют логике, но не Я не знаю, как использовать логику Include, которую вы опубликовали, поэтому я думаю, что обратный поиск будет не таким уж грязным решением

0
ответ дан 29 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: